/*
 * Fichier : Joueur.java
 * Version : 1.0.0
 * Auteurs : Alexandre BOURSIER & Nolan POTIER
 * 
 * Description : Entité modélisant le joueur pour tous les jeux
 */
package club.jeux.persistence;

import club.jeux.common.Resultat_PFC;
import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

@Entity
// Définir des requêtes SQL prédéfinies
@NamedQueries(
   value={@NamedQuery(name="findPlayer", query="select object(j) from Joueur j where j.login= :login and j.password= :password" ),
        @NamedQuery(name="findLogin", query="select object(j) from Joueur j where j.login= :login" )
   }
)
public class Joueur implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    // Définir l'identifiant unique
    private String login;
    
    // Définir l'email
    private String email;
    
    // Définir le mot de passe
    private String password;
    
    // Définir le nombre de parties jouées
    private int gamesPlayed;
    
    // Définir le nombre de partie gagnées
    private int gamesWon;
    
    /** 
     * @return le login du joueur courant
     */
    public String getLogin() {
        return login;
    }

    /**
     * Modifier le login du joueur courant
     * @param id le nouveau login
     */
    public void setLogin(String id) {
        this.login = id;
    }
    
    /** 
     * @return l'email du joueur courant
     */
    public String getEmail(){
        return email;
    }
    
    /**
     * Modifier l'email du joueur courant
     * @param email le nouvel email
     */
    public void setEmail(String email){
        this.email=email;
    }
    
   /** 
     * @return le mot de passe du joueur courant
     */
    public String getPassword(){
        return password;
    }
    
   /**
     * Modifier le mot de passe du joueur courant
     * @param pass le nouveau mot de passe
     */
    public void setPassword(String pass){
        this.password = pass;
    }
    
    /**
     * Constructeur par défaut
     */
    public Joueur(){
        gamesPlayed = 0;
        gamesWon = 0;
    }

    /**
     * Constructeur normal
     * @param login le login cible
     * @param email l'email cible
     * @param pass le mot de passe cible
     */
    public Joueur(String login, String email, String pass) {
        setLogin(login);
        setEmail(email);
        setPassword(stringToPwd(pass));
    }
    
    /**
     * Crypter un mot de passe
     * @param password le mot de passe non-crypté
     * @return le mot de passé crypté
     */
     public static String stringToPwd(String password){
        byte[] hash      = null;
        byte[] uniqueKey = password.getBytes();
        
        try
        {
            hash = MessageDigest.getInstance("MD5").digest(uniqueKey);
        }
        catch (NoSuchAlgorithmException e)
        {
            throw new Error("No MD5 support in this VM.");
        }
        
        StringBuilder hashString = new StringBuilder();
        for (int i = 0; i < hash.length; i++)
        {
                String hex = Integer.toHexString(hash[i]);
                if (hex.length() == 1)
                {
                        hashString.append('0');
                        hashString.append(hex.charAt(hex.length() - 1));
                }
                else{
                        hashString.append(hex.substring(hex.length() - 2));
                }
        }
        
        return hashString.toString();
    }

    @Override
    /**
     * Surcharge de la méthode de comparaison
     * @param object l'objet à comparer
     */
    public boolean equals(Object object) {
        if (!(object instanceof Joueur)) {
            return false;
        }
        Joueur other = (Joueur) object;
        if ((this.login == null && other.login != null) || (this.login != null && !this.login.equals(other.login))) {
            return false;
        }
        return true;
    }

    @Override
    /**
     * Surcharge de la méthode d'affichage
     */
    public String toString() {
        return "club.jeux.persistence.Joueur[ id=" + login + " ]";
    }

    /**
     * @return le nombre de parties jouées
     */
    public int getGamesPlayed() {
        return gamesPlayed;
    }

    /**
     * Modifier le nombre de parties jouées
     * @param gamePlayed le nouveau nombre de parties jouées
     */
    public void setGamesPlayed(int gamePlayed) {
        this.gamesPlayed = gamePlayed;
    }

    /**
     * @return le nombre de parties gagnées
     */
    public int getGamesWon() {
        return gamesWon;
    }

    /**
     * Modifier le nombre de parties gagnées
     * @param gameWon le nouveau nombre de parties gagnées
     */
    public void setGamesWon(int gameWon) {
        this.gamesWon = gameWon;
    }
    
    /**
     * Ajouuter une partie 
     * @param r le résultat de la partie
     */
    public void ajouterPartie(Resultat_PFC r){
        if(r.equals(Resultat_PFC.VICTOIRE)){
            gamesWon++;
        }
        gamesPlayed++;
    }
    
    /**
     * Calculer le ratio défini par le nombre de parties gagnées / nombre de parties jouées
     * @return le ratio cible
     */
    public double ratio(){
       if(gamesPlayed == 0 || gamesWon == 0){
           return 0;
       }
       else {
           System.out.println("nombre gagné : " + gamesWon);
           System.out.println("nombre joué : " + gamesPlayed);

           System.out.println((double)gamesWon/(double)gamesPlayed);
           
           return ((double)gamesWon/(double)gamesPlayed);
       }
    }
    
}
